package br.com.ss.util;

import java.io.UnsupportedEncodingException;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;

public class MessageUtil {

	private static ResourceBundle bundle;
	private static ResourceBundle bundleMessage;

	/**
	 * Método utilizado para buscar mensagens que não possuem parâmetros, no Bundle
	 * @param key
	 * @return String
	 * @author Rodrigo Carvalho
	 * 
	 */
	public static String getMessage(String key){
		return getMessage(key, null);
	}

	/**
	 * Método utilizado para buscar mensagens de erro que não possuem parâmetros, no Bundle
	 * @param key
	 * @return String
	 * @author Rodrigo Carvalho
	 * 
	 */
	public static String getMessageErro(String key){
		return getBundleMessage(key, null);
	}

	/**
	 * Método utilizado para buscar mensagens que possuem parâmetros no Bundle
	 * @param key
	 * @param params
	 * @return String
	 * 
	 * 
	 */
	public static String getMessage(String key, Object[] params){

		if(bundle == null){
			FacesContext context = FacesContext.getCurrentInstance();
			Locale locale = null;
			UIViewRoot viewRoot = null;
			if(context!=null){
				viewRoot = context.getViewRoot();
				locale = viewRoot.getLocale();
			}       
			ClassLoader loader = Thread.currentThread().getContextClassLoader();
			bundle = ResourceBundle.getBundle("br.com.ss.messagebundle", locale, loader);
		}       

		String value = getValueForBundle(bundle,key);

		if(params != null){
			MessageFormat formatter = new MessageFormat(value, bundle.getLocale());
			value = formatter.format(converteParametrosUTF8(params));
		}


		return value;
	}

	/**
	 * Método utilizado para buscar mensagens que possuem parâmetros no Bundle sem internacionalização
	 * @param key
	 * @param params
	 * @return String
	 * 
	 * 
	 */
	public static String getMessageNoLocale(String key, Object[] params){

		if(bundle == null){
			bundle = ResourceBundle.getBundle("br.com.ss.messagebundle");
		}       

		String value = getValueForBundle(bundle,key);

		if(params != null){
			MessageFormat formatter = new MessageFormat(value, bundle.getLocale());
			value = formatter.format(converteParametrosUTF8(params));
		}

		return value;
	}

	/**
	 * Método utilizado para buscar mensagens de erro que possuem parâmetros, no Bundle
	 * @param key
	 * @param params
	 * @return String
	 * @author Rodrigo Carvalho 
	 * 
	 */
	public static String getBundleMessage(String key, Object[] params){

		if(bundleMessage == null){
			FacesContext context = FacesContext.getCurrentInstance();
			Locale locale = null;
			UIViewRoot viewRoot = null;

			if(context!=null){
				viewRoot = context.getViewRoot();
				locale = viewRoot.getLocale();
			}

			ClassLoader loader = Thread.currentThread().getContextClassLoader();
			bundleMessage = ResourceBundle.getBundle("br.com.ss.messagebundle.messages", locale, loader);
		}       

		String value = getValueForBundle(bundleMessage,key);

		if(params != null){
			MessageFormat formatter = new MessageFormat(value, bundleMessage.getLocale());
			value = formatter.format(converteParametrosUTF8(params));
		}

		return value;
	}

	/**
	 * Método utilizado para buscar mensagens de erro que possuem parâmetros, no Bundle, sem internacionalização
	 * @param key
	 * @param params
	 * @return String
	 * 
	 * 
	 */
	public static String getBundleMessageNoLocale(String key, Object[] params)
	{
		String value = null;
		if(bundleMessage == null){
			bundleMessage = ResourceBundle.getBundle("br.com.ss.messagebundle.messages");
		}       

		value = getValueForBundle(bundleMessage,key);

		if(params != null){
			MessageFormat formatter = new MessageFormat(value, bundleMessage.getLocale());
			value = formatter.format(converteParametrosUTF8(params));
		}
		return value;
	}

	private static String getValueForBundle(ResourceBundle rb, String key)
	{
		String value = null;
		try
		{
			if(rb == null){
				throw new MissingResourceException("","","");
			}       
			value = rb.getString(key);
		}
		catch(MissingResourceException err)
		{
			value = "RESOURCE BUNDLE NAO ENCONTRADO!";
		}		
		return value;
	}


	/**
	 * Método responsável pela conversão de String para encoding UTF8. Torna caracteres especiais legíveis na tela
	 * 
	 * @param texto
	 * @return String
	 * @author Rodrigo Carvalho
	 * 
	 */
	public static String utf8Converter(String texto) {
		byte array[];
		String novaString = "";
		try {
			array = texto.getBytes("UTF-8");
			novaString = new String(array, "ISO-8859-1");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return novaString;
	}

	/**
	 * Método responsável por pegar os parâmetros enviados para as msg e mandar converter os que são String.
	 * 
	 * @param params
	 * @return Object[]
	 * @author Rodrigo Carvalho
	 * 
	 */
	private static Object[] converteParametrosUTF8(Object[] params) {
		for (Object ob : params) {
			if (ob instanceof String)
				ob = utf8Converter((String) ob);
		}

		return params;
	}	
}